最后更新时间:2020年12月15日
功能介绍
MapGIS Mobile Android SDK全面对接GIS服务器-MapGIS IGServer,支持直接调用在线IGServer的功能服务,同时也支持调用其他第三方Rest服务,扩展弹性很大,在二次开发时能较好满足各种场景功能需求。
基本原理
MapGIS IGServer服务器为用户提供了很多功能服务,例如网络分析、叠加分析、投影变换、影像分析等一系列的功能,用户可以根据其服务需要的数据、参数等信息构造Rest服务请求,发送请求后等待处理结果,然后将结果进行解析、展示。
实现流程
接下来介绍如何在移动端对接扩展IGServer服务器提供的功能服务。在此以调用IGServer路径分析工作流服务为例,选择武汉道路网中任意位置点(至少2个),计算位置点间的最短路径,并在客户端显示。
1
查看路径分析服务的参数要求,如下图所示,包括网络数据、路径点等参数,在进行服务调用时,需准备好必要的信息。
2
首先实现地图显示,便于分析结果的展示。
mMapView = (MapView) findViewById(R.id.mapView); mMapView.loadFromFile(Environment.getExternalStorageDirectory().getPath() + "/MapGISSample/Map/MapShow/WuHanRoadNetwork/whdlw.mapx"); //加载武汉道路网地图
2
根据道路网数据,寻找确定道路网上的坐标点,作为路径分析的路径点。在移动端可将坐标点绘制显示出来。
Dot dot1 = new Dot(114.46421, 38.024017); //起点 GraphicPoint graphicPoint1 = new GraphicPoint(dot1, 10); graphicPoint1.setColor(Color.RED); Dot dot2 = new Dot(114.53485, 38.069916); //终点 GraphicPoint graphicPoint2 = new GraphicPoint(dot2, 10); graphicPoint2.setColor(Color.RED); mMapView.getGraphicsOverlay().addGraphic(graphicPoint1);//添加绘制起点 mMapView.getGraphicsOverlay().addGraphic(graphicPoint2); //添加绘制终点 mMapView.refresh(); //刷新地图
2
首先,根据网络类数据URL、路径点等信息构建路径分析工作流服务需要的参数。然后构造Rest服务请求,利用HttpURLConnection发送请求,然后获取分析结果。注意网络请求需在子线程中执行。执行路径分析功能服务请求核心代码如下:
public void requestRest () { //路径分析参数(工作流参数) String paraValues = "netClsUrl:gdbp://MapGisLocal/sample/ds/网络分析/ncls/道路交通网;" + "flagPosStr:114.46421,38.024017,114.53485,38.069916;" //路径点坐标序列 + "elementType:2;" //网络类型:1/2:节点网标/线网标 + "barrierPosStr:null;" //障碍点坐标序列 + "nearDis:0.1;" //网标搜索半径 + "analyTp:UserMode;" //分析类型:用户自定义 + "weight:,Weight1,Weight1;" //设置网络类的某些属性字段作为权值字段 + "pathStr:null;" // + "outFormat:json"; //返回结果类型:json格式 try { //REST请求路径分析工作流 String strUrl = "http://develop.smaryun.com:6163/igs/rest/mrfws/execute/600233?paraValues=" + paraValues + "&f=json&isAsy=false&r=" + Math.random(); URL url = new URL(strUrl); //创建HttpURLConnection对象 HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); //设置请求方式 httpURLConnection.setRequestMethod("GET"); //设置超时时间 httpURLConnection.setConnectTimeout(5000); //连接 httpURLConnection.connect(); //得到响应状态码的返回值 int code = httpURLConnection.getResponseCode(); String result = ""; //正常响应 if (code == 200) { //输入流 InputStream inputStream = httpURLConnection.getInputStream(); //输入流读出器 InputStreamReader inputStreamReader = new InputStreamReader(inputStream); //字符输入缓冲类 BufferedReader bufferedReader = new BufferedReader(inputStreamReader); String line; //从循环流中读取信息 while ((line = bufferedReader.readLine()) != null) { result += line; } //关闭流 bufferedReader.close(); } //断开连接 httpURLConnection.disconnect(); //解析json parseJson(result); Log.d("requestIGServerService", "result:" + result); } catch (Exception e) { Log.d("requestIGServerService", e.getMessage().toString()); e.printStackTrace(); //路径分析失败 } }
2
获取路径分析结果并解析,核心代码如下:
/** * Json数据解析 * @param strResult */ private void parseJson (String strResult){ try { JSONObject jsonObj1 = new JSONObject(strResult); JSONArray results = jsonObj1.getJSONArray("results"); JSONObject resultObj = results.getJSONObject(0); String resultStr = resultObj.getString("Value" JSONObject valueObj = new JSONObject(resultStr);//var resultObj = $.parseJSON(result); JSONArray pathsArr = valueObj.getJSONArray("Paths");//paths数组 JSONObject pathObj = pathsArr.getJSONObject(0); JSONArray edgesArr = pathObj.getJSONArray("Edges"); Dot[] coorsDots = new Dot[edgesArr.length() * 2]; int n = 0; for (int i = 0; i < edgesArr.length(); i++) { JSONObject edgeObj = edgesArr.getJSONObject(i);//edges[i] JSONArray dotArr = edgeObj.getJSONArray("Dots"); for (int j = 0; j < 2; j++) { JSONObject dotObj = dotArr.getJSONObject(j);//Dots[i] Dot dot = new Dot(); dot.x = dotObj.getDouble("x"); dot.y = dotObj.getDouble("y"); coorsDots[n] = dot; n++; }//for j }//for i drawGraphicPolylin(coorsDots); //绘制路线 } catch (JSONException e) { System.out.println("Json parse error"); e.printStackTrace(); } } /** * 绘制路线 * @param coorsDots */ public void drawGraphicPolylin (Dot[]coorsDots){ //设置绘制的路径 GraphicPolylin graphicPolylin = new GraphicPolylin(); for (int k = 0; k < coorsDots.length; k++) { graphicPolylin.appendPoint(coorsDots[k]); graphicPolylin.setColor(Color.argb(255, 0, 0, 255)); } mMapView.getGraphicsOverlay().addGraphic(graphicPolylin); //绘制该路径 mMapView.refresh(); }
实现结果如下图所示: